package com.yygh.oss.service.impl;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.yygh.oss.service.FileService;
import com.yygh.oss.utils.ConstantOssPropertiesUtils;
import org.joda.time.DateTime;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;

@Service
public class FileServiceImpl implements FileService {
    
    @Override
    public String upload(MultipartFile file) {

        // 1、判断文件是否为空，以及文件类型检验，检验通过进行数据的存储

        // 2、文件效验通过，进行文件上传操作
        // 获取常量值
        String endpoint = ConstantOssPropertiesUtils.EDNPOINT;
        String accessKeyId = ConstantOssPropertiesUtils.ACCESS_KEY_ID;
        String accessKeySecret = ConstantOssPropertiesUtils.SECRECT;
        String bucket = ConstantOssPropertiesUtils.BUCKET;

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        // 创建文件输出流

        InputStream inputStream = null;

        try {
            // 获取文件流
            inputStream = file.getInputStream();
            String filename = file.getOriginalFilename();
            // 给文件名字添加一个随机的UUID防止名字一样
            filename = UUID.randomUUID().toString() + filename;
            // 设置保存文件在oss的路径
            // 按照当前日期设置文件的保存路径，进一步防止文件名字一样
            String timeUrl = new DateTime().toString("yyyy/MM/dd");
            String savePath = timeUrl + "/" + filename;
            // 上传
            ossClient.putObject(bucket, savePath, inputStream);
            // 拼接文件的访问url地址
            String url = "https://" + bucket + "." + endpoint + "/" + savePath;
            //返回
            return url;

        } catch (IOException e) {
            e.printStackTrace();
            return null;
        } finally {
            // 关闭OSSClient。
            ossClient.shutdown();
            try {
                // 关闭文件输出流
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
                return null;
            }
        }
    }
}
